ASP.NET Core একটি দ্রুত, স্কেলেবল এবং ক্লাউড-নেটিভ ফ্রেমওয়ার্ক, তবে কিছু বিশেষ টেকনিক্যাল অপটিমাইজেশন প্রয়োগ করে এর পারফরম্যান্স আরও উন্নত করা যায়। সঠিক অপটিমাইজেশন অ্যাপ্লিকেশনের দ্রুততা বৃদ্ধি করতে এবং রিসোর্স ব্যবহারের দক্ষতা উন্নত করতে সাহায্য করে। এই টিউটোরিয়ালে কিছু গুরুত্বপূর্ণ Performance Optimization Techniques নিয়ে আলোচনা করা হবে।
Caching হল একটি শক্তিশালী প্রযুক্তি যা একাধিক রিকোয়েস্টে একই ডেটা বারবার পাওয়ার পরিবর্তে, সেই ডেটাটি একটি ক্যাশে রাখতে সাহায্য করে। এতে সার্ভারের লোড কমে যায় এবং ডেটা দ্রুত উপলব্ধ হয়।
In-memory caching হচ্ছে একটি সহজ ক্যাশিং প্রযুক্তি যা অ্যাপ্লিকেশন মেমোরিতে ডেটা সংরক্ষণ করে। এটি খুব দ্রুত এবং সার্ভারের মধ্যে ডেটা শেয়ার করার প্রয়োজন হয় না।
Implementation Example:
public class HomeController : Controller
{
private readonly IMemoryCache _cache;
public HomeController(IMemoryCache memoryCache)
{
_cache = memoryCache;
}
public IActionResult Index()
{
if (!_cache.TryGetValue("MyData", out string myData))
{
myData = "Some expensive data fetching result";
// Set cache with absolute expiration time of 5 minutes
_cache.Set("MyData", myData, TimeSpan.FromMinutes(5));
}
return View((object)myData);
}
}
Distributed caching ব্যবহার করা হয় যখন অ্যাপ্লিকেশন ক্লাস্টার আর্কিটেকচারে চলে এবং একাধিক সার্ভারে ক্যাশড ডেটা শেয়ার করা হয়। Redis বা SQL Server ক্যাশে জনপ্রিয় ডিস্ট্রিবিউটেড ক্যাশ সিস্টেম হিসেবে ব্যবহৃত হয়।
Implementation Example (Redis):
public void ConfigureServices(IServiceCollection services)
{
services.AddStackExchangeRedisCache(options =>
{
options.Configuration = "localhost:6379";
options.InstanceName = "SampleApp_";
});
}
Response compression (যেমন GZIP) HTTP রেসপন্সের সাইজ কমিয়ে দেয়, যার ফলে ডেটা দ্রুত ক্লায়েন্টে পৌঁছায় এবং ব্যান্ডউইথ সাশ্রয় হয়। এটি সাধারণত স্ট্যাটিক ফাইল বা ডাইনামিক রেসপন্সের জন্য ব্যবহার করা হয়।
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
app.UseResponseCompression();
}
এছাড়াও, appsettings.json
ফাইলে ResponseCompression
কনফিগার করা যেতে পারে:
{
"ResponseCompression": {
"EnableForHttps": true,
"Providers": [
"Gzip",
"Brotli"
]
}
}
Asynchronous programming অ্যাপ্লিকেশনকে একাধিক থ্রেডের উপর কাজ করার সুযোগ দেয়, যাতে সার্ভারের পারফরম্যান্স বৃদ্ধি পায়। এটা CPU-bound অপারেশন এবং I/O-bound অপারেশনকে সমান্তরালে চালাতে সাহায্য করে।
public async Task<IActionResult> GetData()
{
var data = await _service.GetExpensiveDataAsync();
return View(data);
}
এটি ডাটাবেস বা অন্যান্য সার্ভিস থেকে ডেটা ফেরত আনতে সহায়ক এবং সার্ভারের থ্রেডগুলো অপটিমাইজ করতে সাহায্য করে।
Database queries অ্যাপ্লিকেশনের পারফরম্যান্সে বড় ভূমিকা রাখে। অপটিমাইজড ডাটাবেস কোয়েরি এবং ইন্ডেক্সিংয়ের মাধ্যমে দ্রুত ডেটা অ্যাক্সেস করা সম্ভব।
var products = _context.Products.Include(p => p.Category).ToList();
Minification হল ফাইলের আকার কমানোর একটি প্রক্রিয়া, যেখানে ফাইলের অব্যবহৃত স্পেস, কমেন্ট এবং অপ্রয়োজনীয় চিহ্ন অপসারণ করা হয়। Bundling হল একাধিক ফাইলকে একত্রিত করে একটি একক ফাইলে পরিণত করা, যার ফলে কম রিকোয়েস্ট করতে হয়।
ASP.NET Core Bundling এবং Minification এর জন্য LibMan (Library Manager) এবং Webpack ব্যবহার করতে পারেন। এছাড়া, ASP.NET Core StaticFiles Middleware এর মাধ্যমে স্ট্যাটিক ফাইল মিনিফাই করা যায়।
এক্সটার্নাল API বা সেবা থেকে ডেটা সংগ্রহের ক্ষেত্রে সিঙ্ক্রোনাস কলের কারণে অ্যাপ্লিকেশনের পারফরম্যান্সে হানি হতে পারে। এর বদলে, asynchronous calls ব্যবহার করা উচিত, যা অ্যাপ্লিকেশনকে একাধিক কাজের জন্য অপেক্ষা করার পরিবর্তে দ্রুত কার্যকর হতে সহায়ক।
public async Task<IActionResult> FetchDataFromExternalAPI()
{
var result = await _httpClient.GetStringAsync("https://externalapi.com/data");
return View(result);
}
Blocking calls যেমন সিঙ্ক্রোনাস I/O অপারেশন অ্যাপ্লিকেশনের থ্রেডের উপর চাপ তৈরি করতে পারে, বিশেষ করে ওয়েব অ্যাপ্লিকেশনে। এমন অবস্থা এড়ানোর জন্য async-await প্যাটার্ন ব্যবহার করা উচিত।
public async Task<IActionResult> GetData()
{
var data = await _repository.GetDataAsync(); // Asynchronous call
return View(data);
}
Server-side rendering (SSR) ক্লায়েন্ট-সাইড JavaScript-এ রেন্ডারিং করার পরিবর্তে সার্ভারে HTML রেন্ডার করে পাঠায়। এটি ওয়েব পেজগুলির লোড টাইম দ্রুত করে এবং SEO-এর জন্য সহায়ক।
ASP.NET Core এর মাধ্যমে Razor Pages ব্যবহার করে SSR করা সম্ভব।
যখন অ্যাপ্লিকেশনের লোড বাড়ে, তখন load balancing এবং horizontal scaling গুরুত্বপূর্ণ হয়ে দাঁড়ায়। Load balancer ব্যবহার করে একাধিক সার্ভারে ট্র্যাফিক ডিস্ট্রিবিউট করা হয় এবং সার্ভার সংখ্যা বাড়িয়ে স্কেল করা যায়।
পারফরম্যান্স অপটিমাইজেশন নিশ্চিত করার জন্য অ্যাপ্লিকেশনটির পারফরম্যান্স profiling এবং monitoring করা প্রয়োজন। Application Insights, New Relic, অথবা Elasticsearch, Logstash, Kibana (ELK Stack) ইত্যাদি টুলস ব্যবহার করে অ্যাপ্লিকেশনের পারফরম্যান্স মনিটর করতে পারেন।
ASP.NET Core অ্যাপ্লিকেশনের পারফরম্যান্স অপটিমাইজ করার জন্য বেশ কিছু শক্তিশালী কৌশল রয়েছে, যেমন caching, response compression, asynchronous programming, database optimization, minification, এবং load balancing। সঠিক অপটিমাইজেশন টেকনিক ব্যবহার করে আপনি অ্যাপ্লিকেশনের রেসপন্স টাইম কমাতে পারেন এবং এটি আরও স্কেলেবল ও স্থিতিশীল করতে পারেন।
Caching হলো একটি পদ্ধতি যার মাধ্যমে ডেটা সঞ্চিত করা হয়, যাতে পরবর্তীতে সেই ডেটা দ্রুত পাওয়া যায়। ASP.NET Core-এ দুটি প্রধান ধরনের ক্যাশিং ব্যবহৃত হয়: In-memory caching এবং Distributed caching। ক্যাশিং ব্যবহারের মূল উদ্দেশ্য হল অ্যাপ্লিকেশনের পারফরম্যান্স উন্নত করা এবং সিস্টেমের প্রতিক্রিয়া সময় (response time) কমানো।
Caching হল ডেটা স্টোর করার একটি প্রক্রিয়া যেখানে একবার ডেটা প্রাপ্তির পর সেটি সঞ্চিত (store) করা হয়। পরবর্তীতে একই ডেটা আবার পুনরায় প্রাপ্ত করার সময় ক্যাশ থেকে ডেটা সরাসরি পাওয়া যায়, যা সাধারণ ডাটাবেস বা ফাইল সিস্টেমের তুলনায় অনেক দ্রুত হয়। ASP.NET Core ক্যাশিং এর জন্য In-memory Caching এবং Distributed Caching সমর্থন করে।
In-memory Caching হচ্ছে একটি ক্যাশিং পদ্ধতি যেখানে ডেটা অ্যাপ্লিকেশনের মেমরিতে সঞ্চিত হয়। এটি সাধারনত ছোট অ্যাপ্লিকেশন বা যেসব অ্যাপ্লিকেশন একটিমাত্র সার্ভারে রান করে তাদের জন্য উপযুক্ত। এই ক্যাশে ডেটা যখন একবার অ্যাক্সেস করা হয়, তখন তা অ্যাপ্লিকেশনের মেমরিতে সঞ্চিত হয় এবং পরবর্তী রিকোয়েস্টে খুব দ্রুত পাওয়া যায়।
ASP.NET Core-এ In-memory Caching ব্যবহার করতে হলে, প্রথমে Startup.cs বা Program.cs-এ AddMemoryCache()
মেথডটি যুক্ত করতে হবে।
Program.cs ফাইল কনফিগারেশন:
var builder = WebApplication.CreateBuilder(args);
// In-memory cache সার্ভিস যোগ করা
builder.Services.AddMemoryCache();
var app = builder.Build();
// ইন-মেমরি ক্যাশ ব্যবহার করতে প্রয়োজনীয় মিডলওয়্যার এবং অন্যান্য কনফিগারেশন
app.MapGet("/", (IMemoryCache cache) =>
{
// ক্যাশ চেক করা
if (!cache.TryGetValue("Time", out string time))
{
time = DateTime.Now.ToString();
// ক্যাশে ডেটা যোগ করা
cache.Set("Time", time, TimeSpan.FromMinutes(5));
}
return time;
});
app.Run();
এই উদাহরণে:
Distributed Caching এমন একটি ক্যাশিং সিস্টেম, যেখানে ডেটা একাধিক সার্ভারে সঞ্চিত হয় এবং বিভিন্ন সার্ভার থেকে অ্যাক্সেস করা যায়। এটি মূলত বড় অ্যাপ্লিকেশন, ক্লাউড অ্যাপ্লিকেশন, বা এমনকি ক্লাস্টার করা সার্ভার ইনফ্রাস্ট্রাকচারের জন্য উপযুক্ত। Redis এবং NCache জনপ্রিয় distributed cache সিস্টেম।
ASP.NET Core-এ Distributed Caching ব্যবহার করতে হলে, সাধারণত Redis বা SQL Server ব্যবহার করা হয়। নিচে Redis ক্যাশ কনফিগারেশনের উদাহরণ দেওয়া হল:
প্রথমে, Redis NuGet প্যাকেজ ইন্সটল করুন:
dotnet add package Microsoft.Extensions.Caching.StackExchangeRedis
Program.cs ফাইল কনফিগারেশন:
var builder = WebApplication.CreateBuilder(args);
// Redis Caching সার্ভিস যোগ করা
builder.Services.AddStackExchangeRedisCache(options =>
{
options.Configuration = "localhost:6379"; // Redis সার্ভারের কনফিগারেশন
options.InstanceName = "SampleApp:";
});
var app = builder.Build();
app.MapGet("/", (IDistributedCache cache) =>
{
var cacheKey = "Time";
string time = cache.GetString(cacheKey);
if (string.IsNullOrEmpty(time))
{
time = DateTime.Now.ToString();
// Redis ক্যাশে ডেটা সঞ্চয় করা
cache.SetString(cacheKey, time, new DistributedCacheEntryOptions()
{
AbsoluteExpirationRelativeToNow = TimeSpan.FromMinutes(5)
});
}
return time;
});
app.Run();
এই উদাহরণে:
ASP.NET Core অ্যাপ্লিকেশনগুলিতে In-memory Caching এবং Distributed Caching ব্যবহারের মাধ্যমে পারফরম্যান্স বাড়ানো সম্ভব। In-memory caching ছোট এবং সহজ অ্যাপ্লিকেশনগুলির জন্য উপযুক্ত, যেখানে ডিস্ট্রিবিউটেড ক্যাশিং বড়, ক্লাউড-বেসড অ্যাপ্লিকেশনগুলির জন্য আদর্শ। Redis বা NCache ব্যবহারের মাধ্যমে ডিস্ট্রিবিউটেড ক্যাশ পরিচালনা করা সম্ভব। ক্যাশিং অ্যাপ্লিকেশনের প্রতিক্রিয়া সময় কমানোর জন্য একটি গুরুত্বপূর্ণ প্রযুক্তি।
Response Compression Middleware হলো ASP.NET Core এর একটি বিল্ট-ইন ফিচার, যা সার্ভার থেকে ক্লায়েন্টে পাঠানো ডেটার আকার কমিয়ে অ্যাপ্লিকেশনের পারফরম্যান্স বাড়ায়। এটি HTTP রেসপন্সের আকার কমাতে gzip, brotli, বা custom compression providers ব্যবহার করে।
ASP.NET Core এর জন্য Microsoft.AspNetCore.ResponseCompression NuGet প্যাকেজ ইন্সটল করুন:
dotnet add package Microsoft.AspNetCore.ResponseCompression
Middleware যোগ করার জন্য Program.cs
ফাইল আপডেট করুন:
var builder = WebApplication.CreateBuilder(args);
// Response Compression Middleware সেবায় যুক্ত করা
builder.Services.AddResponseCompression(options =>
{
options.Providers.Add<GzipCompressionProvider>(); // gzip যোগ করা
options.Providers.Add<BrotliCompressionProvider>(); // brotli যোগ করা
options.EnableForHttps = true; // HTTPS এর জন্য Compression চালু করা
});
// Compression Level সেট করা (Advanced Configuration)
builder.Services.Configure<BrotliCompressionProviderOptions>(options =>
{
options.Level = System.IO.Compression.CompressionLevel.Fastest;
});
builder.Services.Configure<GzipCompressionProviderOptions>(options =>
{
options.Level = System.IO.Compression.CompressionLevel.SmallestSize;
});
var app = builder.Build();
// Response Compression Middleware অ্যাপ্লিকেশনে যুক্ত করা
app.UseResponseCompression();
app.MapGet("/", () => "This is a compressed response!");
app.Run();
Gzip হলো সবচেয়ে জনপ্রিয় এবং সমর্থিত কমপ্রেশন পদ্ধতি। এটি সহজে কনফিগারযোগ্য এবং ব্রাউজার দ্বারা সমর্থিত।
options.Providers.Add<GzipCompressionProvider>();
Brotli একটি আধুনিক কমপ্রেশন অ্যালগরিদম, যা gzip এর চেয়ে আরও ভালো কমপ্রেশন সরবরাহ করে।
options.Providers.Add<BrotliCompressionProvider>();
আপনার নিজস্ব কমপ্রেশন প্রোভাইডার তৈরি করতে:
public class CustomCompressionProvider : ICompressionProvider
{
public string EncodingName => "custom";
public bool SupportsFlush => true;
public Stream CreateStream(Stream outputStream)
{
// Custom compression logic
return outputStream;
}
}
Middleware-এ প্রোভাইডার যোগ করুন:
options.Providers.Add<CustomCompressionProvider>();
EnableForHttps
HTTPS রেসপন্স কমপ্রেসড করতে EnableForHttps
সক্রিয় করুন। ডিফল্টভাবে এটি বন্ধ থাকে।
options.EnableForHttps = true;
MimeTypes
কোন ধরনের কন্টেন্ট কমপ্রেস করা হবে তা নির্ধারণ করতে:
options.MimeTypes = ResponseCompressionDefaults.MimeTypes.Concat(new[]
{
"application/json",
"text/css",
"image/svg+xml"
});
CompressionLevel
Compression Level নির্ধারণ করে ডেটা কম্প্রেশন ও পারফরম্যান্সের মধ্যে ভারসাম্য বজায় রাখা যায়:
Accept-Encoding
হেডার পরীক্ষা করা হয়।Content-Encoding
হেডার চেক করুন (e.g., gzip, br)।curl -H "Accept-Encoding: gzip" https://localhost:5001
Response Compression Middleware ASP.NET Core অ্যাপ্লিকেশনের পারফরম্যান্স এবং ব্যবহারকারীর অভিজ্ঞতা উন্নত করার একটি শক্তিশালী টুল। এটি সহজে কনফিগারযোগ্য এবং HTTPS সহ সব ধরনের পরিবেশে কার্যকর।
অ্যাপ্লিকেশন পারফরম্যান্স অপটিমাইজেশন অত্যন্ত গুরুত্বপূর্ণ, কারণ দ্রুত এবং দক্ষ অ্যাপ্লিকেশন ব্যবহারকারীর অভিজ্ঞতা উন্নত করতে সাহায্য করে এবং সার্ভারের রিসোর্সের ব্যবহার কমাতে সহায়তা করে। ASP.NET Core অ্যাপ্লিকেশনগুলোর পারফরম্যান্স অপটিমাইজেশন করা গেলে অ্যাপ্লিকেশন দ্রুত, স্কেলেবল এবং রিলায়েবল হবে।
এখানে কিছু গুরুত্বপূর্ণ পারফরম্যান্স অপটিমাইজেশন টিপস এবং বেস্ট প্র্যাকটিস দেওয়া হলো যা ASP.NET Core অ্যাপ্লিকেশনগুলোর পারফরম্যান্স উন্নত করতে সাহায্য করবে।
.Append
বা StringBuilder ব্যবহার করুন, কারণ একাধিক স্ট্রিং কনক্যাটেনেট করার সময় এটা আরও কার্যকরী হয়।var sb = new StringBuilder();
sb.Append("Hello ");
sb.Append("World");
var result = sb.ToString();
ক্যাশিং পারফরম্যান্সের ক্ষেত্রে গুরুত্বপূর্ণ ভূমিকা পালন করে, কারণ এটি বারবার একই ডেটা পাওয়ার জন্য সার্ভারকে পুনরায় প্রসেস করতে বাধা দেয়।
ASP.NET Core তে In-memory Caching ব্যবহার করে অ্যাপ্লিকেশন রেসপন্স টাইম দ্রুত করা সম্ভব। এটি ডেটাবেস, API কল বা অন্য কোন সিস্টেম থেকে প্রাপ্ত ডেটা ক্যাশে রাখতে সাহায্য করে।
public class HomeController : Controller
{
private readonly IMemoryCache _memoryCache;
public HomeController(IMemoryCache memoryCache)
{
_memoryCache = memoryCache;
}
public IActionResult Index()
{
string cacheKey = "cachedData";
if (!_memoryCache.TryGetValue(cacheKey, out string cachedData))
{
cachedData = GetExpensiveData();
_memoryCache.Set(cacheKey, cachedData, TimeSpan.FromMinutes(5));
}
return View(cachedData);
}
}
অথবা Distributed Caching ব্যবহার করা যেতে পারে যদি আপনার অ্যাপ্লিকেশন অনেক সার্ভারে চলমান থাকে (যেমন Cloud environment বা Microservices architecture)।
Redis বা SQL Server ভিত্তিক ক্যাশিং ব্যবহৃত হয় সাধারণত ডিসট্রিবিউটেড ক্যাশিংয়ের জন্য।
// Eager Loading Example
var orders = context.Orders.Include(o => o.Customer).ToList();
স্ট্যাটিক ফাইল যেমন CSS, JavaScript, Images ইত্যাদির সাইজ কমানোর মাধ্যমে ওয়েব পেজের লোড টাইম কমানো যায়।
ASP.NET Core তে এই কাজগুলো স্বয়ংক্রিয়ভাবে করা যেতে পারে। আপনি WebOptimizer প্যাকেজ ব্যবহার করতে পারেন।
public void ConfigureServices(IServiceCollection services)
{
services.AddWebOptimizer();
}
HTTP রেসপন্স কম্প্রেস করার মাধ্যমে আপনার অ্যাপ্লিকেশন ডেটা দ্রুত পাঠাতে সক্ষম হবে। Gzip
বা Brotli
কম্প্রেশন ব্যবহার করতে পারেন।
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
app.UseResponseCompression();
}
কিছু নির্দিষ্ট রিসোর্সের জন্য আপনি Response Caching ব্যবহার করতে পারেন, যার মাধ্যমে সার্ভার রিপিটিটিভ রেসপন্স তৈরি করতে বাধ্য হবে না।
public void ConfigureServices(IServiceCollection services)
{
services.AddResponseCaching();
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
app.UseResponseCaching();
}
ডেটাবেস কুয়েরি, ফাইল রিড বা ওয়েব সার্ভিস কল করার সময় async/await ব্যবহার করে অ্যাপ্লিকেশনকে রেসপন্সিভ এবং দ্রুত রাখতে হবে।
public async Task<IActionResult> GetCustomerData()
{
var customerData = await _customerService.GetAllCustomersAsync();
return View(customerData);
}
আপনার অ্যাপ্লিকেশনের পারফরম্যান্স মনিটর করার জন্য Application Insights বা Serilog এর মতো টুল ব্যবহার করুন। এগুলি আপনার অ্যাপ্লিকেশনের পারফরম্যান্স এবং অন্যান্য সমস্যাগুলোর ট্র্যাকিং করে।
services.AddApplicationInsightsTelemetry(Configuration["ApplicationInsights:InstrumentationKey"]);
ASP.NET Core অ্যাপ্লিকেশনের পারফরম্যান্স অপটিমাইজেশন একটি ধারাবাহিক প্রক্রিয়া যা কোড অপটিমাইজেশন, ক্যাশিং, ডেটাবেস অপটিমাইজেশন, স্ট্যাটিক ফাইল অপটিমাইজেশন, অ্যাসিঙ্ক্রোনাস প্রোগ্রামিং এবং আরও অনেক প্রযুক্তি ব্যবহার করে করা যায়। সঠিক ক্যাশিং, কম্প্রেশন, এবং লোড ব্যালান্সিংয়ের মাধ্যমে অ্যাপ্লিকেশনটির লোড টাইম কমানো এবং সার্ভারের রিসোর্স ব্যবহার উন্নত করা সম্ভব। এই বেস্ট প্র্যাকটিসগুলি মেনে চললে ASP.NET Core অ্যাপ্লিকেশনের পারফরম্যান্স নিশ্চিতভাবে বৃদ্ধি পাবে।
Entity Framework Core (EF Core) একটি শক্তিশালী ORM (Object-Relational Mapping) ফ্রেমওয়ার্ক যা ডেটাবেস অপারেশনকে অনেক সহজ করে দেয়। তবে, EF Core ব্যবহার করে ডেটাবেস অ্যাক্সেসের পারফরম্যান্স অপটিমাইজ করা অত্যন্ত গুরুত্বপূর্ণ, বিশেষ করে বড় অ্যাপ্লিকেশনগুলির ক্ষেত্রে যেখানে ডেটাবেস কলের সংখ্যা এবং ডেটার আকার অনেক বেশি হতে পারে। ডেটাবেস পারফরম্যান্স অপটিমাইজেশন করতে হলে কিছু মূল কৌশল অনুসরণ করা প্রয়োজন।
এখানে EF Core ব্যবহার করে ডেটাবেস পারফরম্যান্স উন্নত করার জন্য কিছু টিপস এবং কৌশল তুলে ধরা হচ্ছে।
EF Core-এ ডেটা লোড করার সময় তিনটি পদ্ধতি ব্যবহৃত হয়: Eager Loading, Lazy Loading, এবং Explicit Loading। সঠিক পদ্ধতি নির্বাচন পারফরম্যান্সে বড় প্রভাব ফেলতে পারে।
Eager loading-এর মাধ্যমে সংশ্লিষ্ট এনটিটি ডেটা একসাথে লোড করা হয়, যাতে একাধিক রিকোয়েস্ট না করতে হয়।
উদাহরণ:
var orders = context.Orders
.Include(o => o.Customer) // Eager load customer data
.ToList();
Lazy loading-এর মাধ্যমে, সংশ্লিষ্ট ডেটা শুধু তখনই লোড করা হয় যখন প্রয়োজন হয়। এটি পুঃনরায় ডেটাবেস কল করতে পারে, যা পারফরম্যান্সে নেতিবাচক প্রভাব ফেলতে পারে যদি প্রয়োজনীয় ডেটা একাধিক বার লোড করা হয়।
উদাহরণ:
var order = context.Orders.First();
Console.WriteLine(order.Customer.Name); // Lazy load customer when accessed
Explicit loading ব্যবহার করলে, আপনি স্পষ্টভাবে উল্লেখ করেন কোন সম্পর্কিত ডেটা লোড করতে হবে, এবং এই লোডিং শুধুমাত্র একটি রিকোয়েস্টে করা হয়।
উদাহরণ:
var order = context.Orders.First();
context.Entry(order).Reference(o => o.Customer).Load(); // Explicit load customer
যখন একটি রেকর্ডের সাথে সম্পর্কিত অনেক ডেটা লোড করা প্রয়োজন হয়, তখন Eager Loading ব্যবহৃত করা উচিত। তবে, ডেটা অ্যাক্সেসের পরিমাণ অনেক বেশি হলে Lazy Loading বা Explicit Loading কম পরিমাণে ব্যবহার করুন।
ডেটাবেস থেকে শুধু প্রয়োজনীয় কলামগুলো নির্বাচন করা (প্রজেকশন) পারফরম্যান্স উন্নত করতে সাহায্য করে। এটি সার্ভারের উপর লোড কমায় এবং ডেটাবেসের ট্রান্সফার সময়কে দ্রুত করে।
উদাহরণ:
var orderSummaries = context.Orders
.Select(o => new { o.Id, o.OrderDate, o.TotalAmount }) // Only select required columns
.ToList();
পারফরম্যান্স টিপ:
Select ব্যবহার করে শুধুমাত্র প্রয়োজনীয় তথ্য ফেরত আনুন, যাতে ডেটাবেসে অতিরিক্ত কলাম ফেচ না হয়।
N+1 Query Problem ঘটে যখন একাধিক এনটিটি একে একে ডেটাবেস থেকে লোড করা হয়। এটি বহু রিকোয়েস্ট তৈরি করতে পারে এবং পারফরম্যান্সের উপর নেতিবাচক প্রভাব ফেলতে পারে।
var orders = context.Orders.ToList();
foreach (var order in orders)
{
var customer = order.Customer; // Lazy Loading: 1 query for orders, N queries for customers
}
এই ক্ষেত্রে, প্রথমে সমস্ত অর্ডার লোড হচ্ছে, তারপর প্রতিটি অর্ডারের জন্য পৃথকভাবে Customer লোড হচ্ছে।
পারফরম্যান্স টিপ:
এই সমস্যা সমাধানে Eager Loading ব্যবহার করুন যাতে সমস্ত ডেটা একবারে লোড করা যায় এবং অতিরিক্ত ডেটাবেস রিকোয়েস্ট এড়ানো যায়।
var orders = context.Orders
.Include(o => o.Customer) // Eager Load customer data
.ToList();
EF Core সাধারণত একে একে ডেটাবেসের সাথে যোগাযোগ করে, তবে আপনি একাধিক কুয়েরি একত্রে চালানোর জন্য batching ব্যবহার করতে পারেন। এটি ডেটাবেসের সাথে কম রাউন্ড-ট্রিপ তৈরি করে এবং পারফরম্যান্স উন্নত করতে সহায়তা করে।
উদাহরণ:
var orders = context.Orders
.Where(o => o.Status == "Pending")
.ToList();
var customers = context.Customers
.Where(c => c.IsActive)
.ToList();
উপরের দুটি কুয়েরি আলাদাভাবে চলবে। তবে আপনি batching ব্যবহার করে একাধিক কুয়েরি একসাথে চালাতে পারেন।
AsNoTracking ব্যবহার করলে EF Core ডেটাবেসের ডেটাকে ট্র্যাকিং ছাড়া ফেরত দেয়, যার ফলে পারফরম্যান্স বৃদ্ধি পায় যদি আপনি শুধু ডেটা পড়ছেন এবং মডেলটি পরিবর্তন করবেন না।
উদাহরণ:
var orders = context.Orders
.AsNoTracking()
.Where(o => o.Status == "Completed")
.ToList();
পারফরম্যান্স টিপ:
যখন আপনি শুধুমাত্র ডেটা রিড করছেন এবং কোন পরিবর্তন করতে না চান, তখন AsNoTracking() ব্যবহার করুন।
ডেটাবেসে Indexing এর মাধ্যমে আপনি অনুসন্ধান প্রক্রিয়াকে দ্রুত করতে পারেন। সঠিকভাবে ইন্ডেক্সিং করা হলে কুয়েরি পারফরম্যান্স অনেক বেড়ে যায়।
public class Product
{
public int Id { get; set; }
public string Name { get; set; }
public decimal Price { get; set; }
[Index("IX_Product_Name")]
public string Category { get; set; }
}
এখানে, IX_Product_Name নামক একটি ইন্ডেক্স তৈরি করা হয়েছে, যা Category কলামে অনুসন্ধান দ্রুত করতে সাহায্য করবে।
ডেটাবেসের কুয়েরি কখনও কখনও অপটিমাইজ করা প্রয়োজন হতে পারে। EF Core সাধারণত কুয়েরি অপটিমাইজেশনের জন্য ভালভাবে কাজ করে, তবে কিছু বিশেষ কুয়েরি অপটিমাইজেশন স্ট্র্যাটেজি অনুসরণ করা যেতে পারে, যেমন:
EF Core এ কাস্টম কুয়েরি কম্পাইল করার সুবিধা রয়েছে, যা পুনরায় একই কুয়েরি চালানোর সময় কর্মক্ষমতা বাড়ায়।
var compiledQuery = EF.CompileQuery((ApplicationDbContext context) =>
context.Orders.Where(o => o.Status == "Pending"));
var pendingOrders = compiledQuery(context);
এটি কুয়েরি কম্পাইল করে, যাতে ডেটাবেসে বারবার একই কুয়েরি চালানোর পরিবর্তে একটি কম্পাইল করা কুয়েরি ব্যবহার করা হয়।
EF Core পারফরম্যান্স অপটিমাইজেশন ডেটাবেস অ্যাপ্লিকেশনগুলির জন্য খুবই গুরুত্বপূর্ণ। Eager Loading, Lazy Loading, Batching Queries, AsNoTracking, Indexing, Compiled Queries, এবং Query Optimization এর মতো কৌশলগুলি ব্যবহার করে আপনি আপনার ASP.NET Core অ্যাপ্লিকেশনগুলির ডেটাবেস পারফরম্যান্স উল্লেখযোগ্যভাবে উন্নত করতে পারেন। এছাড়াও, ডেটাবেসের সঠিক কনফিগারেশন এবং কুয়েরি অপটিমাইজেশন আপনার অ্যাপ্লিকেশনটিকে আরো দ্রুত এবং দক্ষ করে তুলতে সাহায্য করবে।
common.read_more